/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../macro/head.h"
#include "objs.h"
#include "hook.h"
#include "mgr.h"

namespace xos_config
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static xos_container::i_container * container_ptr = 0;
    static mgr * mgr_ptr = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    mgr::mgr() : m_pProperty(0)
    {
    }

    mgr::~mgr()
    {
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::static_init( xos_container::i_container * pContainer, i_config ** ppv )
    {
        return xos_stl::static_init_module( pContainer, ppv, container_ptr, mgr_ptr );
    }

    xos_container::i_container * mgr::container()
    {
        return container_ptr;
    }

    mgr * mgr::get()
    {
        return mgr_ptr;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    xos::i_release * mgr::set( const char * lpszId, xos::i_release * pProp, bool bAutoRelease )
    {
        xos_stl::auto_lock<thread_lock> lock( &m_lock );
        xos::i_release * pRet = 0;
        pRet = m_pProperty->obj( lpszId );
        m_pProperty->set_obj( lpszId, pProp, bAutoRelease );
        return pRet;
    }

    xos::i_release * mgr::remove( const char * lpszId )
    {
        xos_stl::auto_lock<thread_lock> lock( &m_lock );
        xos::i_release * pRet = 0;
        xos_box::i_variant * pV = m_pProperty->remove( lpszId );
        if( pV )
        {
            pRet = pV->obj( 0 );
            pV->set_obj( 0, true );
        }
        xos_stl::release_interface( pV );
        return pRet;
    }

    xos::i_release * mgr::get( const char * lpszId )
    {
        xos_stl::auto_lock<thread_lock> lock( &m_lock );
        xos::i_release * pRet = 0;
        pRet = m_pProperty->obj( lpszId );
        return pRet;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::put_back_to_pool()
    {
        int ret = 0;
        delete this;
        return ret;
    }

    int mgr::init()
    {
        int ret = 0;

        if( 0 == ret )
        {
            ret = hook::init();
        }

        if( 0 == ret )
        {
            m_pProperty = mgr::container()->box()->get_str_prop();
        }

        return ret;
    }

    int mgr::term()
    {
        int ret = 0;
        xos_stl::release_interface( m_pProperty );
        hook::term();
        return ret;
    }

} // xos_config
